Перейти к основному содержимому

5.16. Справочник по Cobol

Разработчику Архитектору Инженеру

Справочник по Cobol

1. Общая структура программы COBOL

Программа на COBOL состоит из четырёх обязательных разделов (divisions), каждый из которых содержит секции (sections) и параграфы (paragraphs). Все разделы следуют строго определённому порядку:

  • IDENTIFICATION DIVISION — содержит метаданные программы.
  • ENVIRONMENT DIVISION — описывает среду выполнения и внешние ресурсы.
  • DATA DIVISION — объявляет все данные, используемые программой.
  • PROCEDURE DIVISION — содержит исполняемый код.

Эта структура является фундаментальной и неизменной во всех стандартах COBOL.


2. IDENTIFICATION DIVISION

Этот раздел служит для идентификации программы и её авторства. Он всегда начинается с ключевого слова PROGRAM-ID.

Основные элементы:

  • PROGRAM-ID. — указывает имя программы. Имя должно быть уникальным в пределах системы.
  • AUTHOR. — имя или контакт разработчика (необязательно, но рекомендуется).
  • DATE-WRITTEN. — дата создания программы.
  • DATE-COMPILED. — автоматически заполняется компилятором.
  • INSTALLATION. — организация или подразделение, где используется программа.
  • REMARKS. — комментарии общего характера.

Пример:

IDENTIFICATION DIVISION.
PROGRAM-ID. PAYROLL-SYSTEM.
AUTHOR. T. TAGIROV.
DATE-WRITTEN. 2026-01-17.
REMARKS. Расчёт заработной платы сотрудников.

3. ENVIRONMENT DIVISION

Описывает взаимодействие программы с операционной системой и внешними устройствами. Состоит из двух секций:

3.1. CONFIGURATION SECTION

  • SOURCE-COMPUTER. — тип компьютера, на котором написана программа.
  • OBJECT-COMPUTER. — тип компьютера, на котором выполняется программа.
  • SPECIAL-NAMES. — определяет специальные символы, такие как десятичный разделитель (DECIMAL-POINT IS COMMA).

3.2. INPUT-OUTPUT SECTION

Содержит описание файлов и устройств ввода-вывода.

FILE-CONTROL

  • SELECT [логическое-имя] ASSIGN TO [физическое-устройство].
  • Поддерживает параметры:
    • ORGANIZATION IS SEQUENTIAL | INDEXED | RELATIVE
    • ACCESS MODE IS SEQUENTIAL | RANDOM | DYNAMIC
    • RECORD KEY IS [поле]
    • ALTERNATE RECORD KEY IS [поле]
    • FILE STATUS IS [переменная-статуса]

Пример:

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMPLOYEE-FILE ASSIGN TO "EMP.DAT"
ORGANIZATION IS INDEXED
ACCESS MODE IS DYNAMIC
RECORD KEY IS EMP-ID
FILE STATUS IS WS-FILE-STATUS.

4. DATA DIVISION

Самый объёмный раздел. Определяет все данные: файловые записи, рабочие переменные, константы, структуры.

4.1. FILE SECTION

Описывает структуру записей во внешних файлах.

  • Каждый файл начинается с FD [логическое-имя].
  • За ним следует описание записи через 01 уровень.

Пример:

FILE SECTION.
FD EMPLOYEE-FILE.
01 EMPLOYEE-RECORD.
05 EMP-ID PIC 9(6).
05 EMP-NAME PIC X(30).
05 EMP-SALARY PIC 9(7)V99.

4.2. WORKING-STORAGE SECTION

Объявляет переменные, существующие на протяжении всего выполнения программы.

  • Уровни: 01 — основная группа, 02–49 — подгруппы, 77 — независимые элементы, 88 — условные имена (level-88).

Типы данных (PICTURE / USAGE)

  • PIC X(n) — строка из n символов.
  • PIC 9(n) — целое число из n цифр.
  • PIC 9(n)V9(m) — десятичное число с m знаками после запятой (V — неявная точка).
  • PIC S9(n) — знаковое число.
  • PIC A(n) — алфавитные символы (A–Z, a–z, пробел).
  • PIC B — бинарный флаг (в некоторых реализациях).
  • USAGE IS DISPLAY — текстовое представление (по умолчанию).
  • USAGE IS COMP — двоичное представление (машинное).
  • USAGE IS COMP-3 — упакованный десятичный формат (BCD).
  • USAGE IS COMP-5 — native binary (зависит от архитектуры).

Условные имена (Level 88)

Позволяют задавать логические значения:

01 WS-STATUS      PIC X.
88 ACTIVE VALUE 'A'.
88 INACTIVE VALUE 'I'.
88 PENDING VALUE 'P'.

Использование:

IF ACTIVE
PERFORM PROCESS-EMPLOYEE
END-IF.

4.3. LINKAGE SECTION

Описывает данные, передаваемые в программу извне (например, через вызов подпрограммы или транзакцию CICS).

4.4. LOCAL-STORAGE SECTION (COBOL 85+)

Переменные, создаваемые при каждом вызове программы и уничтожаемые после завершения. Аналог локальных переменных в других языках.


5. PROCEDURE DIVISION

Содержит исполняемую логику. Может принимать параметры, если это подпрограмма.

5.1. Заголовок

PROCEDURE DIVISION [USING параметр1, параметр2...].

5.2. Параграфы и секции

  • Параграф — блок кода с именем, заканчивающийся точкой или END-PARAGRAPH.
  • Секция — группа параграфов, начинается с [имя] SECTION.

5.3. Операторы управления потоком

Условные операторы

  • IF условие THEN ... [ELSE ...] END-IF.
  • EVALUATE — аналог switch/case:
    EVALUATE TRUE
    WHEN EMP-SALARY > 100000
    MOVE "HIGH" TO WS-CATEGORY
    WHEN EMP-SALARY > 50000
    MOVE "MEDIUM" TO WS-CATEGORY
    WHEN OTHER
    MOVE "LOW" TO WS-CATEGORY
    END-EVALUATE.

Циклы

  • PERFORM — универсальный цикл:
    • PERFORM параграф — однократный вызов.
    • PERFORM параграф N TIMES — повтор N раз.
    • PERFORM VARYING i FROM 1 BY 1 UNTIL i > 10 — цикл с инкрементом.
    • PERFORM UNTIL условие — цикл с проверкой в конце.
    • PERFORM WITH TEST BEFORE/ AFTER — управление моментом проверки.

Выход из блока

  • EXIT PARAGRAPH, EXIT SECTION, EXIT PROGRAM — явный выход.

6. Встроенные функции (Intrinsic Functions)

COBOL 85 и особенно COBOL 2002+ поддерживают богатый набор встроенных функций.

Числовые функции

  • FUNCTION ABS(x) — модуль числа.
  • FUNCTION SQRT(x) — квадратный корень.
  • FUNCTION LOG(x), FUNCTION EXP(x)
  • FUNCTION MAX(a, b, ...), FUNCTION MIN(...)
  • FUNCTION MOD(a, b) — остаток от деления.
  • FUNCTION REM(a, b) — остаток с учётом знака.

Строковые функции

  • FUNCTION LENGTH(field) — длина строки.
  • FUNCTION TRIM(field LEADING/TRAILING/BOTH)
  • FUNCTION SUBSTRING(field FROM start FOR length)
  • FUNCTION UPPER-CASE(field), FUNCTION LOWER-CASE(field)

Дата и время

  • FUNCTION CURRENT-DATE — возвращает 21-значную строку: ГГГГММДДЧЧММССмммТЗ
  • FUNCTION DATE-OF-INTEGER(days-since-1601)
  • FUNCTION INTEGER-OF-DATE(YYYYMMDD)

Математические и статистические

  • FUNCTION SUM(...), FUNCTION MEAN(...), FUNCTION MEDIAN(...)
  • FUNCTION RANDOM — генератор псевдослучайных чисел.

7. Работа с файлами

Открытие и закрытие

  • OPEN INPUT | OUTPUT | I-O | EXTEND file-name.
  • CLOSE file-name [REEL | UNIT].

Чтение и запись

  • READ file-name [NEXT RECORD] [INTO переменная] [AT END ...]
  • WRITE record [FROM переменная]
  • REWRITE record [FROM переменная]
  • DELETE file-name RECORD

Позиционирование

  • START file-name KEY IS = / > / < key-value — для indexed/random файлов.

8. Подпрограммы и модульность

Вызов подпрограммы

  • CALL "имя-программы" [USING аргументы] [RETURNING результат]
  • Подпрограмма должна иметь PROGRAM-ID совпадающий с именем вызова.

Возврат

  • GOBACK — завершает подпрограмму и возвращает управление вызывающей программе.
  • STOP RUN — завершает всю программу (обычно в main).

9. Отладка и диагностика

  • DISPLAY переменная — вывод в стандартный поток.
  • ACCEPT переменная — ввод с терминала (в учебных целях).
  • ON SIZE ERROR — обработка переполнения при арифметике.
  • ON OVERFLOW — при операциях с таблицами.

10. Таблицы (массивы)

COBOL поддерживает одномерные и многомерные таблицы через OCCURS.

01 STUDENT-TABLE.
05 STUDENT OCCURS 100 TIMES.
10 NAME PIC X(30).
10 GRADE PIC 99.

Доступ:

MOVE "Иванов" TO NAME(1).
ADD 1 TO GRADE(1).

Индексированные таблицы:

01 IDX USAGE IS INDEX.
SET IDX TO 1.
MOVE NAME(IDX) TO WS-TEMP.

Поиск:

  • SEARCH — линейный поиск.
  • SEARCH ALL — бинарный поиск (требует сортировки и KEY IS).

11. Объектно-ориентированное программирование в COBOL (COBOL 2002+)

Начиная со стандарта COBOL 2002, язык поддерживает полноценную объектную модель, совместимую с Java и .NET.

11.1. Классы

Класс объявляется в отдельной программе или в разделе CLASS DEFINITION.

CLASS-ID. BankAccount.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 balance PIC 9(9)V99.

METHOD DIVISION.
*> Конструктор
METHOD-ID. NEW.
PROCEDURE DIVISION USING BY VALUE initialAmount AS BINARY-LONG.
MOVE initialAmount TO balance.
END METHOD NEW.

*> Метод пополнения
METHOD-ID. Deposit.
PROCEDURE DIVISION USING BY VALUE amount AS BINARY-LONG.
ADD amount TO balance.
END METHOD Deposit.

*> Геттер баланса
METHOD-ID. GetBalance.
PROCEDURE DIVISION RETURNING ret AS BINARY-LONG.
MOVE balance TO ret.
END METHOD GetBalance.

END CLASS BankAccount.

11.2. Наследование

Подкласс указывает родительский класс через INHERITS.

CLASS-ID. SavingsAccount INHERITS BankAccount.

METHOD-ID. ApplyInterest.
PROCEDURE DIVISION.
COMPUTE balance = balance * 1.05.
END METHOD ApplyInterest.

END CLASS SavingsAccount.

11.3. Интерфейсы

Интерфейс определяет контракт без реализации:

INTERFACE-ID. Payable.

METHOD-ID. Pay PUBLIC.
PROCEDURE DIVISION USING BY VALUE amount AS BINARY-LONG.
END METHOD Pay.

END INTERFACE Payable.

Класс реализует интерфейс через IMPLEMENTS:

CLASS-ID. Employee IMPLEMENTS Payable.
...
END CLASS Employee.

11.4. Полиморфизм и динамическое связывание

Вызов методов происходит через ссылки на объекты:

01 account OBJECT REFERENCE BankAccount.
01 savings OBJECT REFERENCE SavingsAccount.

SET account TO NEW BankAccount(1000).
SET savings TO NEW SavingsAccount(2000).

INVOKE account::Deposit(500).
INVOKE savings::ApplyInterest().

12. Работа с базами данных: Embedded SQL

COBOL тесно интегрируется с реляционными СУБД через встроенный SQL.

12.1. Подключение

В EXEC SQL блоках пишется стандартный SQL.

EXEC SQL INCLUDE SQLCA END-EXEC.
EXEC SQL WHENEVER SQLERROR GO TO DB-ERROR END-EXEC.

12.2. Подключение к БД

EXEC SQL CONNECT TO 'mydb' USER 'user' USING 'password' END-EXEC.

12.3. Выборка данных

EXEC SQL
SELECT name, salary INTO :WS-NAME, :WS-SALARY
FROM employees
WHERE id = :WS-ID
END-EXEC.

Хост-переменные (:WS-NAME) должны быть объявлены в WORKING-STORAGE.

12.4. Курсоры для множественных строк

EXEC SQL DECLARE emp_cursor CURSOR FOR
SELECT id, name FROM employees
END-EXEC.

EXEC SQL OPEN emp_cursor END-EXEC.

PERFORM UNTIL SQLCODE NOT = 0
EXEC SQL FETCH emp_cursor INTO :WS-ID, :WS-NAME END-EXEC
IF SQLCODE = 0
PERFORM PROCESS-EMPLOYEE
END-IF
END-PERFORM.

EXEC SQL CLOSE emp_cursor END-EXEC.

12.5. Обновление и транзакции

EXEC SQL UPDATE employees SET salary = salary * 1.1 WHERE dept = 'IT' END-EXEC.
EXEC SQL COMMIT WORK END-EXEC.
EXEC SQL ROLLBACK WORK END-EXEC.

13. Современные расширения: JSON, XML, веб

13.1. Работа с JSON (COBOL 2014+)

Поддержка парсинга и генерации JSON через встроенные функции.

01 json-text PIC X(1000) VALUE '{"name":"Alice","age":30}'.
01 parsed-name PIC X(50).
01 parsed-age PIC 99.

CALL "JSON-PARSE" USING json-text, "name", parsed-name.
CALL "JSON-PARSE" USING json-text, "age", parsed-age.

Некоторые компиляторы (например, Micro Focus) предоставляют модули JSON GENERATE и JSON PARSE.

13.2. XML

Аналогично — через XML GENERATE и XML PARSE:

XML GENERATE xml-output FROM employee-record
COUNT IN ws-count
ON EXCEPTION DISPLAY "Ошибка XML"
END-XML.

13.3. Веб-сервисы

COBOL может выступать как клиент или сервер SOAP/REST:

  • INVOKE WEB SERVICE — вызов удалённого сервиса.
  • SERVICE-SECTION — определение собственного сервиса (в CICS или Enterprise Server).

14. Параметры компиляции в популярных средах

14.1. IBM Enterprise COBOL for z/OS

Часто используемые опции:

  • ARCH(10) — целевая архитектура процессора.
  • OPTIMIZE(FULL) — полная оптимизация.
  • RENT — создание рекурсивно-вызываемого модуля.
  • LIST — генерация листинга.
  • MAP — таблица символов.
  • SQL — включить поддержку Embedded SQL.
  • CICS — генерация кода для CICS.
  • DLL — создание динамической библиотеки.

Пример:

//COBOL EXEC PGM=IGYCRCTL,
//PARM='LIB,LIST,MAP,OPTIMIZE(FULL),SQL'

14.2. GnuCOBOL (open source)

Компиляция:

cobc -x -free -std=cobol2023 payroll.cbl

Опции:

  • -x — исполняемый файл.
  • -m — модуль (библиотека).
  • -free — свободный формат.
  • -std=cobol85|cobol2002|cobol2014|cobol2023
  • -O2 — оптимизация.
  • -I include_dir — пути к копиям.
  • -L lib_dir -l library — линковка.

14.3. Micro Focus Visual COBOL

  • Поддержка .NET и JVM.
  • Интеграция с Visual Studio.
  • Опции: ilgen, jvmgen, debug, trace.

15. Настройки локализации и валют

15.1. Десятичный разделитель

В SPECIAL-NAMES:

SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.

Теперь PIC 999V99 будет отображаться как 123,45.

15.2. Валюта

SPECIAL-NAMES.
CURRENCY SIGN IS "₽".

Использование:

01 price PIC ₽99999V99.

Отображение: ₽12345,67.

15.3. Кодировки

  • CODE-SET IS UTF-8 — в FD или SD.
  • ALPHABET — определение пользовательского алфавита.

16. Практические структуры и шаблоны

16.1. Обработка ошибок файлов

SELECT EMP-FILE ASSIGN TO "EMP.DAT"
FILE STATUS IS WS-FS.

...

READ EMP-FILE
AT END MOVE "Y" TO EOF-FLAG
END-READ.

EVALUATE WS-FS
WHEN "00" CONTINUE
WHEN "10" DISPLAY "Конец файла"
WHEN "23" DISPLAY "Запись не найдена"
WHEN OTHER DISPLAY "Ошибка: " WS-FS
END-EVALUATE.

16.2. Журналирование

01 LOG-RECORD.
05 LOG-TIME PIC X(8).
05 LOG-MESSAGE PIC X(100).

MOVE FUNCTION CURRENT-DATE(9:8) TO LOG-TIME.
MOVE "Обработка сотрудника завершена" TO LOG-MESSAGE.
WRITE LOG-RECORD.

16.3. Защита от переполнения

ADD A TO B ON SIZE ERROR
DISPLAY "Переполнение при сложении"
MOVE 99999999 TO RESULT
END-ADD.

17. Производительность и оптимизация

  • Используйте COMP-3 для чисел — меньше памяти, быстрее операции.
  • Избегайте STRING и UNSTRING в циклах — они медленные.
  • Предпочитайте SEARCH ALL вместо SEARCH для больших таблиц.
  • Минимизируйте количество MOVE CORRESPONDING — он неэффективен.
  • Используйте INITIALIZE вместо ручного обнуления.

18. Безопасность и надёжность

  • Все входные данные из файлов или терминала проверяйте на корректность.
  • Используйте VALIDATE (в Enterprise COBOL) для контроля форматов.
  • Не храните пароли в открытом виде в исходном коде.
  • Применяйте ON EXCEPTION при работе с внешними ресурсами.

19. Полный список зарезервированных слов COBOL (по стандарту ISO/IEC 1989:2023)

COBOL содержит более 350 зарезервированных слов. Ниже приведены ключевые категории и наиболее часто используемые термины. Слова сгруппированы по функциональному назначению для удобства навигации.

19.1. Структурные слова разделов и секций

IDENTIFICATION DIVISION
ENVIRONMENT DIVISION
DATA DIVISION
PROCEDURE DIVISION
CONFIGURATION SECTION
INPUT-OUTPUT SECTION
FILE SECTION
WORKING-STORAGE SECTION
LINKAGE SECTION
LOCAL-STORAGE SECTION
SCREEN SECTION
REPORT SECTION
CLASS DEFINITION
INTERFACE DEFINITION
METHOD DIVISION

19.2. Идентификация и метаданные

PROGRAM-ID
AUTHOR
DATE-WRITTEN
DATE-COMPILED
INSTALLATION
REMARKS
CLASS-ID
INTERFACE-ID
METHOD-ID

19.3. Описание данных

PIC PICTURE
USAGE
OCCURS
REDEFINES
RENAMES
VALUE
VALUES
INITIALIZE
BLANK
JUSTIFIED
SIGN
SYNCHRONIZED SYNC
COMP COMPUTATIONAL
COMP-1 COMP-2 COMP-3 COMP-4 COMP-5
BINARY
PACKED-DECIMAL
DISPLAY
POINTER
OBJECT REFERENCE

19.4. Условные имена и логика

LEVEL 88
TRUE
FALSE
NULL
ZERO ZEROS ZEROES
SPACE SPACES
HIGH-VALUE HIGH-VALUES
LOW-VALUE LOW-VALUES
QUOTE QUOTES

19.5. Управление выполнением

IF THEN ELSE END-IF
EVALUATE WHEN OTHER END-EVALUATE
PERFORM END-PERFORM
VARYING BY UNTIL
TIMES
WITH TEST BEFORE AFTER
EXIT PARAGRAPH SECTION PROGRAM
GOBACK
STOP RUN
CONTINUE
NEXT SENTENCE

19.6. Ввод-вывод и файлы

SELECT ASSIGN TO
ORGANIZATION
ACCESS MODE
SEQUENTIAL RANDOM DYNAMIC
RECORD KEY
ALTERNATE RECORD KEY
FILE STATUS
FD SD
OPEN CLOSE READ WRITE REWRITE DELETE
START
AT END
INVALID KEY

19.7. Арифметика и операции

ADD SUBTRACT MULTIPLY DIVIDE COMPUTE
GIVING REMAINDER ROUNDED
ON SIZE ERROR
CORRESPONDING CORR
MOVE
SET
TO
UPON

19.8. Таблицы и поиск

SEARCH ALL
INDEX
SET INDEX TO
KEY IS
ASCENDING DESCENDING

19.9. Объектно-ориентированные конструкции

INHERITS
IMPLEMENTS
EXTENDS
OVERRIDE
ABSTRACT
FINAL
PUBLIC PRIVATE PROTECTED
NEW
INVOKE
SUPER
THIS

19.10. Встроенные функции

FUNCTION
ABS ACOS ASIN ATAN COS SIN TAN
EXP LOG SQRT
MAX MIN SUM MEAN MEDIAN
TRIM SUBSTRING LENGTH
UPPER-CASE LOWER-CASE
CURRENT-DATE
INTEGER-OF-DATE DATE-OF-INTEGER
RANDOM

19.11. SQL и базы данных

EXEC SQL END-EXEC
INCLUDE
WHENEVER
CONNECT DISCONNECT
DECLARE CURSOR
OPEN CLOSE FETCH
COMMIT ROLLBACK

19.12. Отладка и системные вызовы

DISPLAY ACCEPT
ACCEPT OMITTED
DEBUGGING MODE
DUMP
CALL CANCEL
RETURNING
USING
BY REFERENCE VALUE CONTENT

Примечание: Некоторые слова (например, DEBUGGING, OMITTED) считаются устаревшими, но поддерживаются для обратной совместимости.


20. Сравнение диалектов COBOL

Разные компиляторы реализуют стандарт с различной степенью полноты и добавляют собственные расширения.

20.1. IBM Enterprise COBOL for z/OS

  • Основной диалект для мейнфреймов.
  • Поддержка CICS, IMS, DB2.
  • Расширения: XML GENERATE, JSON PARSE, VALIDATE.
  • Оптимизация под архитектуру z/Architecture.
  • Строгая проверка формата колонок (если не указан -free).

20.2. Micro Focus Visual COBOL

  • Поддержка Windows, Linux, .NET, JVM.
  • Полная ООП-модель, включая наследование и интерфейсы.
  • Интеграция с Visual Studio и Eclipse.
  • Расширения: METHOD, PROPERTY, EVENT.
  • Поддержка REST/SOAP через WEB SERVICE.

20.3. GnuCOBOL (open source)

  • Кроссплатформенный, компилирует в C.
  • Поддержка COBOL 85, частично COBOL 2002.
  • Не поддерживает встроенный ООП (только через обёртки).
  • Подходит для обучения и миграции небольших систем.
  • Гибкий свободный формат (-free).

20.4. Fujitsu NetCOBOL

  • Для Windows и .NET.
  • Хорошая поддержка GUI через SCREEN SECTION.
  • Совместимость с Visual COBOL по синтаксису.
  • Включает отладчик и профилировщик.

20.5. ACUCOBOL-GT

  • Ориентирован на бизнес-приложения с GUI.
  • Собственный runtime и виртуальная машина.
  • Поддержка графики, отчётов, сетевых вызовов.

Рекомендация: При переносе кода между платформами избегайте диалект-специфичных конструкций. Используйте только стандартные элементы, если требуется максимальная переносимость.


21. Миграция устаревшего COBOL-кода

21.1. Этапы модернизации

  1. Анализ текущего состояния — сбор метрик: объём кода, количество программ, зависимостей.
  2. Очистка кода — удаление закомментированных блоков, устаревших параграфов.
  3. Переход на свободный формат — замена фиксированного формата (колонки 8–72) на свободный.
  4. Замена GO TO — рефакторинг на PERFORM и структурные конструкции.
  5. Введение END-IF, END-PERFORM — явное завершение блоков вместо точки.
  6. Добавление LOCAL-STORAGE — для потокобезопасности.
  7. Интеграция с современными API — через JSON/XML или вызов внешних сервисов.

21.2. Автоматизированные инструменты

  • Micro Focus Modernize — преобразует COBOL в .NET или Java.
  • IBM Application Discovery and Delivery Intelligence (ADDI) — анализ зависимостей.
  • Raincode COBOL Compiler for .NET — компиляция в управляемый код.
  • Open Source: cobc-refactor — скрипты на Python для переформатирования.

21.3. Сохранение бизнес-логики

  • Не меняйте алгоритмы без тестового покрытия.
  • Создайте регрессионные тесты до начала рефакторинга.
  • Используйте COPY книги как модули — не дублируйте логику.

22. Инструменты анализа и качества кода

22.1. SonarQube + COBOL Plugin

  • Анализ сложности, дублирования, уязвимостей.
  • Правила: избегать GO TO, ограничивать длину параграфа, использовать END- конструкции.

22.2. CAST Highlight

  • Оценка технического долга.
  • Классификация компонентов по риску поддержки.

22.3. GnuCOBOL Checker

  • Статический анализ синтаксиса.
  • Проверка соответствия стандарту.

22.4. Встроенные средства компиляторов

  • IBM: TEST опция — генерация отладочной информации.
  • Micro Focus: TRACE — логирование вызовов.

23. Типичные антипаттерны и пути устранения

23.1. "Спагетти-код" с GO TO

Проблема: Непредсказуемый поток управления.
Решение: Заменить на PERFORM параграфов с чёткой семантикой. Использовать EVALUATE вместо цепочек IF.

23.2. Дублирование логики в COPY книгах

Проблема: Изменение в одной копии не применяется ко всем.
Решение: Вынести общую логику в подпрограммы. Использовать параметризованные COPY (если поддерживается).

23.3. Отсутствие обработки FILE STATUS

Проблема: Программа падает при ошибке ввода-вывода.
Решение: Всегда проверять FILE STATUS после операций с файлами. Реализовать централизованную обработку ошибок.

23.4. Жёстко закодированные значения

Проблема: MOVE 12345 TO EMP-ID — трудно поддерживать.
Решение: Использовать константы через 77 или 01 с VALUE. Лучше — условные имена (88 уровень).

23.5. Отсутствие модульности

Проблема: Одна программа делает всё.
Решение: Разделить на main-программу и подпрограммы. Использовать CALL для повторяющихся задач.

23.6. Игнорирование ON SIZE ERROR

Проблема: Переполнение приводит к некорректным данным.
Решение: Добавить обработку арифметических ошибок во всех вычислениях.


24. Рекомендации по стилю и читаемости

  • Используйте осмысленные имена: CUSTOMER-NAME, а не X1.
  • Разделяйте логические блоки пустыми строками.
  • Все параграфы — в UPPER CASE или CamelCase, но единообразно.
  • Комментируйте почему, а не что делает код.
  • Ограничьте длину строки 80 символами (для совместимости).
  • Избегайте NEXT SENTENCE — он устарел и непредсказуем.